package com.demo.crm.springboot3security.service;

import com.demo.crm.springboot3security.entity.CustomForm;
import com.mybatisflex.core.paginate.Page;

import java.util.List;
import java.util.Map;

public interface FormDataService {
    /**
     * 保存表单数据
     * @param form 表单定义
     * @param data 表单数据
     * @return 记录ID
     */
    Long saveFormData(CustomForm form, Map<String, Object> data);

    /**
     * 更新表单数据
     * @param form 表单定义
     * @param recordId 记录ID
     * @param data 表单数据
     */
    void updateFormData(CustomForm form, Long recordId, Map<String, Object> data);

    /**
     * 获取表单数据
     * @param form 表单定义
     * @param recordId 记录ID
     * @return 表单数据
     */
    Map<String, Object> getFormData(CustomForm form, Long recordId);

    /**
     * 删除表单数据
     * @param form 表单定义
     * @param recordId 记录ID
     */
    void deleteFormData(CustomForm form, Long recordId);

    /**
     * 查询表单数据
     * @param form 表单定义
     * @param conditions 查询条件
     * @param page 页码
     * @param size 每页大小
     * @return 表单数据列表
     */
    List<Map<String, Object>> queryFormData(CustomForm form, Map<String, Object> conditions, int page, int size);

    /**
     * 高级查询表单数据
     * @param form 表单定义
     * @param conditions 查询条件，支持多字段组合、模糊查询、范围查询等
     * @param orderBy 排序字段
     * @param page 页码
     * @param size 每页大小
     * @return 分页数据
     */
    Page<Map<String, Object>> advancedQuery(
            CustomForm form,
            Map<String, Object> conditions,
            Map<String, String> orderBy,
            int page,
            int size);

    /**
     * 统计分析
     * @param form 表单定义
     * @param groupBy 分组字段
     * @param aggregates 聚合配置，key为字段名，value为聚合函数（sum, count, avg, max, min）
     * @param conditions 查询条件
     * @return 统计结果
     */
    List<Map<String, Object>> aggregate(
            CustomForm form,
            List<String> groupBy,
            Map<String, String> aggregates,
            Map<String, Object> conditions);

    /**
     * 关联查询
     * @param form 主表单
     * @param recordId 主记录ID
     * @param relationTypes 关联类型列表
     * @return 关联数据
     */
    Map<String, List<Map<String, Object>>> getRelatedData(
            CustomForm form,
            Long recordId,
            List<String> relationTypes);
} 